package com.school.sports.util;

import com.school.sports.entity.Message;
import com.school.sports.websocket.AdminPushWebSocketServer;
import com.school.sports.websocket.MessageWebSocketServer;
import com.school.sports.websocket.SystemMessageWebSocketServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * WebSocket工具类
 * 提供统一的WebSocket消息发送接口
 *
 * @author 系统管理员
 * @version 1.0
 * @since 2023-10-12
 */
@Slf4j
@Component
public class WebSocketUtil {

    /**
     * 发送新消息给指定用户
     *
     * @param message 消息对象
     * @param userIds 接收用户ID数组
     */
    public static void sendNewMessage(Message message, String... userIds) {
        try {
            MessageWebSocketServer.sendNewMessage(message, userIds);
            log.info("发送新消息成功，消息ID: {}, 接收用户数: {}", message.getId(), userIds.length);
        } catch (Exception e) {
            log.error("发送新消息失败", e);
        }
    }

    /**
     * 群发新消息给所有在线用户
     *
     * @param message 消息对象
     */
    public static void sendNewMessageToAll(Message message) {
        try {
            MessageWebSocketServer.sendNewMessage(message);
            log.info("群发新消息成功，消息ID: {}", message.getId());
        } catch (Exception e) {
            log.error("群发新消息失败", e);
        }
    }

    /**
     * 发送推送状态更新给所有管理员
     *
     * @param pushId 推送ID
     * @param title 推送标题
     * @param status 推送状态
     * @param pushTime 推送时间
     * @param failureReason 失败原因
     */
    public static void sendPushStatusUpdate(Long pushId, String title, String status, String pushTime, String failureReason) {
        try {
            AdminPushWebSocketServer.sendPushStatusUpdate(pushId, title, status, pushTime, failureReason);
            log.info("发送推送状态更新成功，推送ID: {}, 状态: {}", pushId, status);
        } catch (Exception e) {
            log.error("发送推送状态更新失败", e);
        }
    }

    /**
     * 发送推送统计数据给所有管理员
     *
     * @param totalPushed 总推送数
     * @param successPushed 成功推送数
     * @param scheduledPushed 定时推送数
     * @param failedPushed 失败推送数
     */
    public static void sendPushStatistics(int totalPushed, int successPushed, int scheduledPushed, int failedPushed) {
        try {
            AdminPushWebSocketServer.sendPushStatistics(totalPushed, successPushed, scheduledPushed, failedPushed);
            log.info("发送推送统计数据成功");
        } catch (Exception e) {
            log.error("发送推送统计数据失败", e);
        }
    }

    /**
     * 发送系统消息状态更新给所有管理员
     *
     * @param messageId 消息ID
     * @param title 消息标题
     * @param status 消息状态
     * @param sendTime 发送时间
     * @param recipientCount 接收人数
     */
    public static void sendMessageStatusUpdate(Long messageId, String title, String status, String sendTime, Integer recipientCount) {
        try {
            SystemMessageWebSocketServer.sendMessageStatusUpdate(messageId, title, status, sendTime, recipientCount);
            log.info("发送系统消息状态更新成功，消息ID: {}, 状态: {}", messageId, status);
        } catch (Exception e) {
            log.error("发送系统消息状态更新失败", e);
        }
    }

    /**
     * 发送新系统消息通知给所有管理员
     *
     * @param messageId 消息ID
     * @param title 消息标题
     * @param messageType 消息类型
     * @param priority 优先级
     */
    public static void sendNewSystemMessage(Long messageId, String title, String messageType, String priority) {
        try {
            SystemMessageWebSocketServer.sendNewSystemMessage(messageId, title, messageType, priority);
            log.info("发送新系统消息通知成功，消息ID: {}", messageId);
        } catch (Exception e) {
            log.error("发送新系统消息通知失败", e);
        }
    }

    /**
     * 发送系统消息统计数据给所有管理员
     *
     * @param totalMessages 总消息数
     * @param sentMessages 已发送消息数
     * @param pendingMessages 待发送消息数
     * @param failedMessages 发送失败消息数
     */
    public static void sendMessageStatistics(int totalMessages, int sentMessages, int pendingMessages, int failedMessages) {
        try {
            SystemMessageWebSocketServer.sendMessageStatistics(totalMessages, sentMessages, pendingMessages, failedMessages);
            log.info("发送系统消息统计数据成功");
        } catch (Exception e) {
            log.error("发送系统消息统计数据失败", e);
        }
    }

    /**
     * 检查用户是否在线
     *
     * @param userId 用户ID
     * @return 是否在线
     */
    public static boolean isUserOnline(String userId) {
        return MessageWebSocketServer.isUserOnline(userId);
    }

    /**
     * 检查管理员是否在线
     *
     * @param adminId 管理员ID
     * @return 是否在线
     */
    public static boolean isAdminOnline(String adminId) {
        return AdminPushWebSocketServer.isAdminOnline(adminId) ||
               SystemMessageWebSocketServer.isAdminOnline(adminId);
    }

    /**
     * 获取当前在线用户数量
     *
     * @return 在线用户数量
     */
    public static int getOnlineUserCount() {
        return MessageWebSocketServer.getOnlineCount();
    }

    /**
     * 获取当前在线管理员数量
     *
     * @return 在线管理员数量
     */
    public static int getOnlineAdminCount() {
        return AdminPushWebSocketServer.getOnlineCount() + SystemMessageWebSocketServer.getOnlineCount();
    }

    /**
     * 发送自定义消息给指定用户
     *
     * @param message 消息内容
     * @param userId 用户ID
     */
    public static void sendCustomMessage(String message, String userId) {
        try {
            MessageWebSocketServer.sendInfo(message, userId);
            log.info("发送自定义消息成功，用户ID: {}", userId);
        } catch (Exception e) {
            log.error("发送自定义消息失败", e);
        }
    }

    /**
     * 发送自定义消息给指定管理员
     *
     * @param message 消息内容
     * @param adminId 管理员ID
     */
    public static void sendCustomMessageToAdmin(String message, String adminId) {
        try {
            AdminPushWebSocketServer.sendInfo(message, adminId);
            log.info("发送自定义消息给管理员成功，管理员ID: {}", adminId);
        } catch (Exception e) {
            log.error("发送自定义消息给管理员失败", e);
        }
    }
}